package com.zhongge.string;

/**
 * @ClassName com.zhongge.string.TalindromeString
 * @Description TODO 回文字符串
 * 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后，短语正着读和反着读都一样。
 * 则可以认为该短语是一个 回文串 。
 * 字母和数字都属于字母数字字符。
 * 给你一个字符串 s，如果它是 回文串 ，返回 true ；否则，返回 false 。
 * 示例 1：
 * 输入: s = "A man, a plan, a canal: Panama"
 * 输出：true
 * 解释："amanaplanacanalpanama" 是回文串。
 * @Author 李明忠
 * @Date 2025/7/11 11:23
 * @Version 1.0
 */
public class TalindromeString {
    public static boolean isLetterAndNumbers(char ch) {
        if (Character.isDigit(ch) || Character.isLetter(ch)) {
            return true;
        }else {
            return false;
        }
    }
    //回文串
    public static boolean isTalindrome(String s) {
        //确保字母都是小写
        s = s.toLowerCase();
        //双指针
        int left = 0;
        int right = s.length() - 1;
        while(left < right) {//一个向前，一个往后
            //左边
            while (left < right && !isLetterAndNumbers(s.charAt(left))){//前一个确保不越界后一个确保是非字母和数组
                left++;
            }
            //右边
            while (left < right && !isLetterAndNumbers(s.charAt(right))){//前一个确保不越界后一个确保是非字母和数组
                right--;
            }
            //每一次移动之后都要进行比较是否相等
            if (s.charAt(left) == s.charAt(right)) {
                left++;
                right--;
            } else {
                return false;
            }
        }
        //一旦程序走到这里说明是回文
        return true;
    }
    public static void main(String[] args) {
        String str = "A man, a plan, a canal: Panama";
        //判断是否是回文串
        System.out.println(isTalindrome(str));
    }
}
